winlin

Merge branch 'srs.1.0release' into 1.0release

@@ -208,10 +208,11 @@ Supported operating systems and hardware: @@ -208,10 +208,11 @@ Supported operating systems and hardware:
208 * 2013-10-17, Created.<br/> 208 * 2013-10-17, Created.<br/>
209 209
210 ## History 210 ## History
  211 +* v2.0, 2014-11-13, hotfix [#200](https://github.com/winlinvip/simple-rtmp-server/issues/200), deadloop when read/write 0 and ETIME. 1.0.6.
211 * v1.0, 2014-11-06, use number for macro VERSION_MAJOR, VERSION_MINOR and VERSION_REVISION. 1.0.5. 212 * v1.0, 2014-11-06, use number for macro VERSION_MAJOR, VERSION_MINOR and VERSION_REVISION. 1.0.5.
212 -* v1.0, 2014-10-24, fix [#186](https://github.com/winlinvip/simple-rtmp-server/issues/186), hotfix for bug #186, drop connect args when not object. 1.0.3. 213 +* v1.0, 2014-10-24, hotfix [#186](https://github.com/winlinvip/simple-rtmp-server/issues/186), drop connect args when not object. 1.0.3.
213 * v1.0, 2014-10-24, rename wiki/xxx to wiki/v1_CN_xxx. 1.0.2. 214 * v1.0, 2014-10-24, rename wiki/xxx to wiki/v1_CN_xxx. 1.0.2.
214 -* v1.0, 2014-10-19, fix [#183](https://github.com/winlinvip/simple-rtmp-server/issues/183), hotfix for bug #183, donot support AnnexB when decoding RTMP body for HLS. 1.0.1. 215 +* v1.0, 2014-10-19, hotfix [#183](https://github.com/winlinvip/simple-rtmp-server/issues/183), donot support AnnexB when decoding RTMP body for HLS. 1.0.1.
215 * <strong>v1.0, 2014-10-09, [1.0 beta(1.0.0)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.beta) released. 59316 lines.</strong> 216 * <strong>v1.0, 2014-10-09, [1.0 beta(1.0.0)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.beta) released. 59316 lines.</strong>
216 * v1.0, 2014-10-08, fix [#151](https://github.com/winlinvip/simple-rtmp-server/issues/151), always reap ts whatever audio or video packet. 0.9.223. 217 * v1.0, 2014-10-08, fix [#151](https://github.com/winlinvip/simple-rtmp-server/issues/151), always reap ts whatever audio or video packet. 0.9.223.
217 * v1.0, 2014-10-08, fix [#162](https://github.com/winlinvip/simple-rtmp-server/issues/162), failed if no epoll. 0.9.222. 218 * v1.0, 2014-10-08, fix [#162](https://github.com/winlinvip/simple-rtmp-server/issues/162), failed if no epoll. 0.9.222.
@@ -82,8 +82,10 @@ int SrsStSocket::read(void* buf, size_t size, ssize_t* nread) @@ -82,8 +82,10 @@ int SrsStSocket::read(void* buf, size_t size, ssize_t* nread)
82 82
83 // On success a non-negative integer indicating the number of bytes actually read is returned 83 // On success a non-negative integer indicating the number of bytes actually read is returned
84 // (a value of 0 means the network connection is closed or end of file is reached). 84 // (a value of 0 means the network connection is closed or end of file is reached).
  85 + // Otherwise, a value of -1 is returned and errno is set to indicate the error.
85 if (nb_read <= 0) { 86 if (nb_read <= 0) {
86 - if (errno == ETIME) { 87 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
  88 + if (nb_read < 0 && errno == ETIME) {
87 return ERROR_SOCKET_TIMEOUT; 89 return ERROR_SOCKET_TIMEOUT;
88 } 90 }
89 91
@@ -110,8 +112,10 @@ int SrsStSocket::read_fully(void* buf, size_t size, ssize_t* nread) @@ -110,8 +112,10 @@ int SrsStSocket::read_fully(void* buf, size_t size, ssize_t* nread)
110 112
111 // On success a non-negative integer indicating the number of bytes actually read is returned 113 // On success a non-negative integer indicating the number of bytes actually read is returned
112 // (a value less than nbyte means the network connection is closed or end of file is reached) 114 // (a value less than nbyte means the network connection is closed or end of file is reached)
  115 + // Otherwise, a value of -1 is returned and errno is set to indicate the error.
113 if (nb_read != (ssize_t)size) { 116 if (nb_read != (ssize_t)size) {
114 - if (errno == ETIME) { 117 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
  118 + if (nb_read < 0 && errno == ETIME) {
115 return ERROR_SOCKET_TIMEOUT; 119 return ERROR_SOCKET_TIMEOUT;
116 } 120 }
117 121
@@ -136,8 +140,11 @@ int SrsStSocket::write(void* buf, size_t size, ssize_t* nwrite) @@ -136,8 +140,11 @@ int SrsStSocket::write(void* buf, size_t size, ssize_t* nwrite)
136 *nwrite = nb_write; 140 *nwrite = nb_write;
137 } 141 }
138 142
  143 + // On success a non-negative integer equal to nbyte is returned.
  144 + // Otherwise, a value of -1 is returned and errno is set to indicate the error.
139 if (nb_write <= 0) { 145 if (nb_write <= 0) {
140 - if (errno == ETIME) { 146 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
  147 + if (nb_write < 0 && errno == ETIME) {
141 return ERROR_SOCKET_TIMEOUT; 148 return ERROR_SOCKET_TIMEOUT;
142 } 149 }
143 150
@@ -158,8 +165,11 @@ int SrsStSocket::writev(const iovec *iov, int iov_size, ssize_t* nwrite) @@ -158,8 +165,11 @@ int SrsStSocket::writev(const iovec *iov, int iov_size, ssize_t* nwrite)
158 *nwrite = nb_write; 165 *nwrite = nb_write;
159 } 166 }
160 167
  168 + // On success a non-negative integer equal to nbyte is returned.
  169 + // Otherwise, a value of -1 is returned and errno is set to indicate the error.
161 if (nb_write <= 0) { 170 if (nb_write <= 0) {
162 - if (errno == ETIME) { 171 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
  172 + if (nb_write < 0 && errno == ETIME) {
163 return ERROR_SOCKET_TIMEOUT; 173 return ERROR_SOCKET_TIMEOUT;
164 } 174 }
165 175
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR 1 32 #define VERSION_MAJOR 1
33 #define VERSION_MINOR 0 33 #define VERSION_MINOR 0
34 -#define VERSION_REVISION 5 34 +#define VERSION_REVISION 6
35 // server info. 35 // server info.
36 #define RTMP_SIG_SRS_KEY "SRS" 36 #define RTMP_SIG_SRS_KEY "SRS"
37 #define RTMP_SIG_SRS_ROLE "origin/edge server" 37 #define RTMP_SIG_SRS_ROLE "origin/edge server"
@@ -82,23 +82,27 @@ int SimpleSocketStream::read(void* buf, size_t size, ssize_t* nread) @@ -82,23 +82,27 @@ int SimpleSocketStream::read(void* buf, size_t size, ssize_t* nread)
82 { 82 {
83 int ret = ERROR_SUCCESS; 83 int ret = ERROR_SUCCESS;
84 84
85 - *nread = ::recv(fd, buf, size, 0); 85 + ssize_t nb_read = ::recv(fd, buf, size, 0);
  86 +
  87 + if (nread) {
  88 + *nread = nb_read;
  89 + }
86 90
87 // On success a non-negative integer indicating the number of bytes actually read is returned 91 // On success a non-negative integer indicating the number of bytes actually read is returned
88 // (a value of 0 means the network connection is closed or end of file is reached). 92 // (a value of 0 means the network connection is closed or end of file is reached).
89 - if (*nread <= 0) {  
90 - if (errno == ETIME) { 93 + if (nb_read <= 0) {
  94 + if (nb_read < 0 && errno == ETIME) {
91 return ERROR_SOCKET_TIMEOUT; 95 return ERROR_SOCKET_TIMEOUT;
92 } 96 }
93 97
94 - if (*nread == 0) { 98 + if (nb_read == 0) {
95 errno = ECONNRESET; 99 errno = ECONNRESET;
96 } 100 }
97 101
98 return ERROR_SOCKET_READ; 102 return ERROR_SOCKET_READ;
99 } 103 }
100 104
101 - recv_bytes += *nread; 105 + recv_bytes += nb_read;
102 106
103 return ret; 107 return ret;
104 } 108 }
@@ -139,17 +143,25 @@ int SimpleSocketStream::writev(const iovec *iov, int iov_size, ssize_t* nwrite) @@ -139,17 +143,25 @@ int SimpleSocketStream::writev(const iovec *iov, int iov_size, ssize_t* nwrite)
139 { 143 {
140 int ret = ERROR_SUCCESS; 144 int ret = ERROR_SUCCESS;
141 145
142 - *nwrite = ::writev(fd, iov, iov_size); 146 + ssize_t nb_write = ::writev(fd, iov, iov_size);
  147 +
  148 + if (nwrite) {
  149 + *nwrite = nb_write;
  150 + }
143 151
144 - if (*nwrite <= 0) {  
145 - if (errno == ETIME) { 152 + // On success, the readv() function returns the number of bytes read;
  153 + // the writev() function returns the number of bytes written. On error, -1 is
  154 + // returned, and errno is set appropriately.
  155 + if (nb_write <= 0) {
  156 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
  157 + if (nb_write < 0 && errno == ETIME) {
146 return ERROR_SOCKET_TIMEOUT; 158 return ERROR_SOCKET_TIMEOUT;
147 } 159 }
148 160
149 return ERROR_SOCKET_WRITE; 161 return ERROR_SOCKET_WRITE;
150 } 162 }
151 163
152 - send_bytes += *nwrite; 164 + send_bytes += nb_write;
153 165
154 return ret; 166 return ret;
155 } 167 }
@@ -165,21 +177,24 @@ int SimpleSocketStream::read_fully(void* buf, size_t size, ssize_t* nread) @@ -165,21 +177,24 @@ int SimpleSocketStream::read_fully(void* buf, size_t size, ssize_t* nread)
165 int ret = ERROR_SUCCESS; 177 int ret = ERROR_SUCCESS;
166 178
167 size_t left = size; 179 size_t left = size;
168 - *nread = 0; 180 + ssize_t nb_read = 0;
169 181
170 while (left > 0) { 182 while (left > 0) {
171 - char* this_buf = (char*)buf + *nread; 183 + char* this_buf = (char*)buf + nb_read;
172 ssize_t this_nread; 184 ssize_t this_nread;
173 185
174 if ((ret = this->read(this_buf, left, &this_nread)) != ERROR_SUCCESS) { 186 if ((ret = this->read(this_buf, left, &this_nread)) != ERROR_SUCCESS) {
175 return ret; 187 return ret;
176 } 188 }
177 189
178 - *nread += this_nread; 190 + nb_read += this_nread;
179 left -= this_nread; 191 left -= this_nread;
180 } 192 }
181 193
182 - recv_bytes += *nread; 194 + if (nread) {
  195 + *nread = nb_read;
  196 + }
  197 + recv_bytes += nb_read;
183 198
184 return ret; 199 return ret;
185 } 200 }
@@ -188,17 +203,22 @@ int SimpleSocketStream::write(void* buf, size_t size, ssize_t* nwrite) @@ -188,17 +203,22 @@ int SimpleSocketStream::write(void* buf, size_t size, ssize_t* nwrite)
188 { 203 {
189 int ret = ERROR_SUCCESS; 204 int ret = ERROR_SUCCESS;
190 205
191 - *nwrite = ::send(fd, (void*)buf, size, 0); 206 + ssize_t nb_write = ::send(fd, (void*)buf, size, 0);
  207 +
  208 + if (nwrite) {
  209 + *nwrite = nb_write;
  210 + }
192 211
193 - if (*nwrite <= 0) {  
194 - if (errno == ETIME) { 212 + if (nb_write <= 0) {
  213 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/200
  214 + if (nb_write < 0 && errno == ETIME) {
195 return ERROR_SOCKET_TIMEOUT; 215 return ERROR_SOCKET_TIMEOUT;
196 } 216 }
197 217
198 return ERROR_SOCKET_WRITE; 218 return ERROR_SOCKET_WRITE;
199 } 219 }
200 220
201 - send_bytes += *nwrite; 221 + send_bytes += nb_write;
202 222
203 return ret; 223 return ret;
204 } 224 }